package io.github.echarts.model.theme;

import java.util.HashMap;
import java.util.Map;
import java.util.ServiceLoader;

/**
 * 主题管理器
 * <p>
 * 管理和提供图表主题的单例类。
 * 负责主题的注册、获取和切换。
 * 支持通过Java SPI机制自动发现和注册主题。
 * </p>
 */
public class ThemeManager {
    
    /**
     * 单例实例
     */
    private static final ThemeManager INSTANCE = new ThemeManager();
    
    /**
     * 主题映射表
     */
    private final Map<String, Theme> themes = new HashMap<>();
    
    /**
     * 当前主题
     */
    private Theme currentTheme;
    
    /**
     * 默认主题名称
     */
    private static final String DEFAULT_THEME_NAME = "default";
    
    /**
     * 延迟主题提供者
     */
    private final LazyThemeProvider lazyProvider;
    
    /**
     * 是否启用延迟加载
     */
    private boolean lazyLoadingEnabled = true;
    
    /**
     * 私有构造函数
     * 初始化时自动发现和注册主题
     */
    private ThemeManager() {
        // 初始化延迟提供者
        lazyProvider = LazyThemeProvider.getInstance();
        
        discoverThemes();
        
        // 确保有默认主题
        if (!themes.containsKey(DEFAULT_THEME_NAME)) {
            registerDefaultTheme();
        }
        
        // 注册内置主题
        registerBuiltInThemes();
        
        // 设置当前主题为默认主题
        currentTheme = themes.get(DEFAULT_THEME_NAME);
    }
    
    /**
     * 获取管理器单例实例
     * 
     * @return 管理器实例
     */
    public static ThemeManager getInstance() {
        return INSTANCE;
    }
    
    /**
     * 使用Java SPI机制发现并注册主题
     */
    private void discoverThemes() {
        ServiceLoader<Theme> serviceLoader = ServiceLoader.load(Theme.class);
        for (Theme theme : serviceLoader) {
            registerTheme(theme);
        }
    }
    
    /**
     * 注册默认主题
     */
    private void registerDefaultTheme() {
        // 返回DefaultTheme实例
        Theme defaultTheme = createDefaultTheme();
        registerTheme(defaultTheme);
    }
    
    /**
     * 注册内置主题
     */
    private void registerBuiltInThemes() {
        // 注册深色主题
        registerTheme(new DarkTheme());
        
        // 可以添加更多内置主题
    }
    
    /**
     * 创建默认主题
     * 
     * @return 默认主题
     */
    private Theme createDefaultTheme() {
        return new DefaultTheme();
    }
    
    /**
     * 注册主题
     * 
     * @param theme 要注册的主题
     */
    public void registerTheme(Theme theme) {
        if (theme != null) {
            themes.put(theme.getName(), theme);
        }
    }
    
    /**
     * 获取当前主题
     * 
     * @return 当前主题
     */
    public Theme getCurrentTheme() {
        return currentTheme;
    }
    
    /**
     * 设置当前主题
     * 
     * @param themeName 主题名称
     * @return 是否成功设置
     */
    public boolean setCurrentTheme(String themeName) {
        Theme theme = getTheme(themeName);
        if (theme != null) {
            currentTheme = theme;
            return true;
        }
        return false;
    }
    
    /**
     * 获取指定名称的主题
     * 
     * @param themeName 主题名称
     * @return 主题对象，如果未找到则返回null
     */
    public Theme getTheme(String themeName) {
        if (lazyLoadingEnabled) {
            return lazyProvider.getOrCreateTheme(themeName, () -> themes.get(themeName));
        }
        return themes.get(themeName);
    }
    
    /**
     * 获取所有可用的主题名称
     * 
     * @return 主题名称数组
     */
    public String[] getAvailableThemeNames() {
        return themes.keySet().toArray(new String[0]);
    }
    
    /**
     * 检查指定名称的主题是否存在
     * 
     * @param themeName 主题名称
     * @return 是否存在
     */
    public boolean hasTheme(String themeName) {
        return themes.containsKey(themeName);
    }
    
    /**
     * 设置是否启用延迟加载
     * 
     * @param enabled 是否启用
     */
    public void setLazyLoadingEnabled(boolean enabled) {
        this.lazyLoadingEnabled = enabled;
        
        // 如果禁用延迟加载，清除缓存
        if (!enabled) {
            lazyProvider.clearCache();
        }
    }
    
    /**
     * 获取是否启用延迟加载
     * 
     * @return 是否启用延迟加载
     */
    public boolean isLazyLoadingEnabled() {
        return lazyLoadingEnabled;
    }
    
    /**
     * 清除主题缓存
     */
    public void clearCache() {
        lazyProvider.clearCache();
    }
} 